package it.azienda.managerworkstandard.view;

import it.azienda.framework.persistenza.DAOConnectionSingleton;
import it.azienda.framework.persistenza.DAOException;
import it.azienda.framework.utilita.Utilita;
import it.azienda.framework.view.Dettaglio;
import it.azienda.managerworkstandard.modello.BeanCorrispettivi;
import it.azienda.managerworkstandard.modello.BeanFattura;
import it.azienda.managerworkstandard.modello.BeanLogin;
import it.azienda.managerworkstandard.modello.BeanScontrino;
import it.azienda.stampe.parametri.BeanStampa;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIViewRoot;
import javax.faces.component.html.HtmlForm;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.hibernate.Query;
import org.hibernate.Session;

public class DettaglioCorrispettivi extends Dettaglio{
    
    private java.util.Date dataDa;
    private java.util.Date dataA;
    private ArrayList listaCorrispettivi = new ArrayList();
    private BeanCorrispettivi corrispettivoUltimo = null;
    private HtmlForm form = new HtmlForm();
    private BeanCorrispettivi beanCorrispettivi = new BeanCorrispettivi();
    
    public void setBeanCorrispettivi(BeanCorrispettivi beanCorrispettivi) {
        setObj(beanCorrispettivi);
        this.beanCorrispettivi = beanCorrispettivi;
    }
    
    public BeanCorrispettivi getBeanCorrispettivi(){
        return (BeanCorrispettivi)getObj();
    }
    
    public HtmlForm getForm() {
        form = (HtmlForm) Utilita.getSession().getAttribute("form");
        if (form == null) {
            form = new HtmlForm();
        }
        FacesContext ctx = FacesContext.getCurrentInstance();
        beanCorrispettivi =(BeanCorrispettivi) ctx.getExternalContext().getRequestMap().get("beanCorrispettivi");
        Utilita.getSession().removeAttribute("form");
        return form;
    }
    
    public void setForm(HtmlForm form) {
        setFormObject(form);
        this.form = form;
        Utilita.getSession().setAttribute("form",form);
    }
    
    public void entra(ActionEvent ae) {
        pulisci();
        corrispettivoUltimo= new BeanCorrispettivi();
        BeanLogin login = (BeanLogin) Utilita.getSession().getAttribute("login");
        Date date = new Date(System.currentTimeMillis());
        Calendar calendario = new GregorianCalendar();
        calendario.setTime(date);
        int meseValuta = calendario.get(Calendar.MONTH);
        
        calendario = new GregorianCalendar(login.getAnnoGestione().intValue(), meseValuta, 1);
        this.dataDa = calendario.getTime();
        int ultimoGiornoMese = calendario.getActualMaximum(GregorianCalendar.DAY_OF_MONTH);
        calendario = new GregorianCalendar(login.getAnnoGestione().intValue(), meseValuta, ultimoGiornoMese);
        this.dataA = calendario.getTime();
        
        beanCorrispettivi.setDataDa(this.dataDa);
        beanCorrispettivi.setDataA(this.dataA);
        try{
            calcolaCorrispettivi();
            listaCorrispettivi.add(corrispettivoUltimo);
            
            beanCorrispettivi.setListaCorrispettivi(listaCorrispettivi);
            Utilita.getRequest().setAttribute("beanCorrispettivi",beanCorrispettivi);
        }catch(Exception e){
            e.printStackTrace();
            System.out.println("Errore"+e);
        }finally{
            DAOConnectionSingleton.closeSession();
        }
        String url2 = "/dettaglioCorrispettivi.jsf";
        FacesContext ctx = FacesContext.getCurrentInstance();
        UIViewRoot view = ctx.getApplication().getViewHandler().createView(ctx,url2);
        view.setViewId(url2);
        ctx.setViewRoot(view);
        ctx.renderResponse();
    }
    
    public void calcolaCorrispettivi() throws DAOException {
        
        //SETTARE LE DATE!!!!!
        while(dataDa.compareTo(dataA) <= 0){
            String query1="select fattura from BeanFattura fattura" +
                    " where fattura.data = :dataDa";
            
            Session session = session = DAOConnectionSingleton.newSession();
            Query q = null;
            DAOConnectionSingleton.beginTransaction();
            q = session.createQuery(query1).setDate("dataDa",dataDa);
            ArrayList listaFatture=(ArrayList)q.list();
            DAOConnectionSingleton.commitTransaction();
            
            String query2="select scontrino from BeanScontrino scontrino" +
                    " where scontrino.data = :dataDa";
            session = session = DAOConnectionSingleton.newSession();
            q = null;
            DAOConnectionSingleton.beginTransaction();
            q = session.createQuery(query2).setDate("dataDa",dataDa);
            ArrayList listaScontrini=(ArrayList)q.list();
            DAOConnectionSingleton.commitTransaction();
            
            BeanCorrispettivi corrispettivi= new BeanCorrispettivi();
            
            Double imponibile4Corr=new Double(0);
            Double imponibile10Corr=new Double(0);
            Double imponibile20Corr=new Double(0);
                        Double imponibile21Corr=new Double(0);
                        Double imponibile22Corr=new Double(0);

                        Double imposta4Corr=new Double(0);
            Double imposta10Corr=new Double(0);
            Double imposta20Corr=new Double(0);
                        Double imposta21Corr=new Double(0);
                        Double imposta22Corr=new Double(0);

                        Double totaleIvaCorr=new Double(0);
            Double totaleImponibileCorr=new Double(0);
            Double totaleCorr=new Double(0);
            Double utileCorr=new Double(0);
            
            if(listaFatture.size()!=0){
                corrispettivi.setNumFattureCorr(new Integer(listaFatture.size()));
                for(int i=0;i < listaFatture.size();i++){
                    BeanFattura beanFattura= (BeanFattura)listaFatture.get(i);
                    imponibile4Corr = arrotonda(new Double(imponibile4Corr.doubleValue() + beanFattura.getImponIva4().doubleValue()),2);
                    imponibile10Corr = arrotonda(new Double(imponibile10Corr.doubleValue() + beanFattura.getImponIva10().doubleValue()),2);
                    imponibile20Corr = arrotonda(new Double(imponibile20Corr.doubleValue() + beanFattura.getImponIva20().doubleValue()),2);
                                        imponibile21Corr = arrotonda(new Double(imponibile21Corr.doubleValue() + beanFattura.getImponIva21().doubleValue()),2);
                                        imponibile22Corr = arrotonda(new Double(imponibile22Corr.doubleValue() + beanFattura.getImponIva22().doubleValue()),2);
                                        
                    imposta4Corr = arrotonda(new Double(imposta4Corr.doubleValue() + beanFattura.getImpostaIva4().doubleValue()),2);
                    imposta10Corr = arrotonda(new Double(imposta10Corr.doubleValue() + beanFattura.getImpostaIva10().doubleValue()),2);
                    imposta20Corr = arrotonda(new Double(imposta20Corr.doubleValue() + beanFattura.getImpostaIva20().doubleValue()),2);
                                        imposta21Corr = arrotonda(new Double(imposta21Corr.doubleValue() + beanFattura.getImpostaIva21().doubleValue()),2);
                                        imposta22Corr = arrotonda(new Double(imposta22Corr.doubleValue() + beanFattura.getImpostaIva22().doubleValue()),2);

                                        utileCorr=arrotonda(new Double(utileCorr.doubleValue() + beanFattura.getUtile().doubleValue()),2);
                }
            }else{
                corrispettivi.setNumFattureCorr(new Integer(0));
            }
            
            if(listaScontrini.size()!=0){
                corrispettivi.setNumScontriniCorr(new Integer(listaScontrini.size()));
                for(int i=0;i<listaScontrini.size();i++){
                    BeanScontrino beanScontrino= (BeanScontrino)listaScontrini.get(i);
                    imponibile4Corr = arrotonda(new Double(imponibile4Corr.doubleValue() + beanScontrino.getImponIva4().doubleValue()),2);
                    imponibile10Corr = arrotonda(new Double(imponibile10Corr.doubleValue() + beanScontrino.getImponIva10().doubleValue()),2);
                    imponibile20Corr = arrotonda(new Double(imponibile20Corr.doubleValue() + beanScontrino.getImponIva20().doubleValue()),2);
                                        imponibile21Corr = arrotonda(new Double(imponibile21Corr.doubleValue() + beanScontrino.getImponIva21().doubleValue()),2);
                                        
                                        imponibile22Corr = arrotonda(new Double(imponibile22Corr.doubleValue() + beanScontrino.getImponIva22().doubleValue()),2);
                    imposta4Corr = arrotonda(new Double(imposta4Corr.doubleValue() + beanScontrino.getImpostaIva4().doubleValue()),2);
                    imposta10Corr = arrotonda(new Double(imposta10Corr.doubleValue() + beanScontrino.getImpostaIva10().doubleValue()),2);
                    imposta20Corr = arrotonda(new Double(imposta20Corr.doubleValue() + beanScontrino.getImpostaIva20().doubleValue()),2);
                                        imposta21Corr = arrotonda(new Double(imposta21Corr.doubleValue() + beanScontrino.getImpostaIva21().doubleValue()),2);
                                        imposta22Corr = arrotonda(new Double(imposta22Corr.doubleValue() + beanScontrino.getImpostaIva22().doubleValue()),2);

                                        utileCorr=arrotonda(new Double(utileCorr.doubleValue() + beanScontrino.getUtile().doubleValue()),2);
                }
            }else{
                corrispettivi.setNumScontriniCorr(new Integer(0));
            }
            
            corrispettivi.setImponibile4Corr(imponibile4Corr);
            corrispettivi.setImponibile10Corr(imponibile10Corr);
            corrispettivi.setImponibile20Corr(imponibile20Corr);
                        corrispettivi.setImponibile21Corr(imponibile21Corr);
                        corrispettivi.setImponibile22Corr(imponibile22Corr);

                        corrispettivi.setImposta4Corr(imposta4Corr);
            corrispettivi.setImposta10Corr(imposta10Corr);
            corrispettivi.setImposta20Corr(imposta20Corr);
                        corrispettivi.setImposta22Corr(imposta22Corr);
            
            totaleImponibileCorr=arrotonda(new Double(imponibile4Corr.doubleValue() + imponibile10Corr.doubleValue() + imponibile20Corr.doubleValue()+ imponibile21Corr.doubleValue()+ imponibile22Corr.doubleValue()),2);
            corrispettivi.setTotaleImponibileCorr(totaleImponibileCorr);
            
            totaleIvaCorr=arrotonda(new Double(imposta4Corr.doubleValue() + imposta10Corr.doubleValue() + imposta20Corr.doubleValue()+ imposta21Corr.doubleValue()+imposta22Corr.doubleValue()),2);
            corrispettivi.setTotaleIvaCorr(totaleIvaCorr);
            
            totaleCorr= arrotonda(new Double(totaleIvaCorr.doubleValue() + totaleImponibileCorr.doubleValue()),2);
            corrispettivi.setTotaleCorr(totaleCorr);
            corrispettivi.setUtileCorr(utileCorr);
            corrispettivi.setData(dataDa);
            listaCorrispettivi.add(corrispettivi);
            
            //Setto le variabili generali
            corrispettivoUltimo.setNumScontriniCorr(new Integer(corrispettivoUltimo.getNumScontriniCorr().intValue() +  listaScontrini.size()));
            corrispettivoUltimo.setNumFattureCorr(new Integer(corrispettivoUltimo.getNumFattureCorr().intValue() +  listaFatture.size()));
            corrispettivoUltimo.setImponibile4Corr(arrotonda(new Double(corrispettivoUltimo.getImponibile4Corr().doubleValue() + corrispettivi.getImponibile4Corr().doubleValue()),2));
            corrispettivoUltimo.setImponibile10Corr(arrotonda(new Double(corrispettivoUltimo.getImponibile10Corr().doubleValue() + corrispettivi.getImponibile10Corr().doubleValue()),2));
            corrispettivoUltimo.setImponibile20Corr(arrotonda(new Double(corrispettivoUltimo.getImponibile20Corr().doubleValue() + corrispettivi.getImponibile20Corr().doubleValue()),2));
                        corrispettivoUltimo.setImponibile21Corr(arrotonda(new Double(corrispettivoUltimo.getImponibile21Corr().doubleValue() + corrispettivi.getImponibile21Corr().doubleValue()),2));
                        corrispettivoUltimo.setImponibile22Corr(arrotonda(new Double(corrispettivoUltimo.getImponibile22Corr().doubleValue() + corrispettivi.getImponibile22Corr().doubleValue()),2));

                        corrispettivoUltimo.setImposta4Corr(arrotonda(new Double(corrispettivoUltimo.getImposta4Corr().doubleValue() + corrispettivi.getImposta4Corr().doubleValue()),2));
            corrispettivoUltimo.setImposta10Corr(arrotonda(new Double(corrispettivoUltimo.getImposta10Corr().doubleValue() + corrispettivi.getImposta10Corr().doubleValue()),2));
            corrispettivoUltimo.setImposta20Corr(arrotonda(new Double(corrispettivoUltimo.getImposta20Corr().doubleValue() + corrispettivi.getImposta20Corr().doubleValue()),2));
                        corrispettivoUltimo.setImposta21Corr(arrotonda(new Double(corrispettivoUltimo.getImposta21Corr().doubleValue() + corrispettivi.getImposta21Corr().doubleValue()),2));
                        corrispettivoUltimo.setImposta22Corr(arrotonda(new Double(corrispettivoUltimo.getImposta22Corr().doubleValue() + corrispettivi.getImposta22Corr().doubleValue()),2));

                        corrispettivoUltimo.setTotaleImponibileCorr(arrotonda(new Double(corrispettivoUltimo.getTotaleImponibileCorr().doubleValue() + corrispettivi.getTotaleImponibileCorr().doubleValue()),2));
            corrispettivoUltimo.setTotaleIvaCorr(arrotonda(new Double(corrispettivoUltimo.getTotaleIvaCorr().doubleValue() + corrispettivi.getTotaleIvaCorr().doubleValue()),2));
            corrispettivoUltimo.setTotaleCorr(arrotonda(new Double(corrispettivoUltimo.getTotaleCorr().doubleValue() + corrispettivi.getTotaleCorr().doubleValue()),2));
            corrispettivoUltimo.setUtileCorr(arrotonda(new Double(corrispettivoUltimo.getUtileCorr().doubleValue() + corrispettivi.getUtileCorr().doubleValue()),2));
            
            Calendar calendarDa = new GregorianCalendar();
            calendarDa.setTime(dataDa);
            int mese = calendarDa.get(Calendar.MONTH);
            int anno = calendarDa.get(Calendar.YEAR);
            int giorno = calendarDa.get(Calendar.DAY_OF_MONTH);
            calendarDa = new GregorianCalendar(anno,mese,giorno + 1);
            dataDa = calendarDa.getTime();
        }
    }
    
    public void pulisci(){
        HttpSession sessione = (HttpSession)Utilita.getSession();
        HttpServletRequest richiesta =(HttpServletRequest)Utilita.getRequest();
        
        sessione.removeAttribute("form");
        sessione.removeAttribute("posizioneOggetto");
        sessione.removeAttribute("beanFind");
    }
    public Double arrotonda(Object obj,int precisione){
        Double valore=(Double)obj;
        Double valoreArr=new Double(0);
        double pot = Math.pow(10, precisione);
        double  v = valore.doubleValue() * pot;
        valoreArr = new Double(Math.round(v) / pot);
        return valoreArr;
    }
    
    public void calcolaNuovoPeriodoCorrispettivi(){
        Utilita.getRequest().removeAttribute("form");
        beanCorrispettivi=(BeanCorrispettivi)Utilita.getRequest().getAttribute("beanCorrispettivi");
        corrispettivoUltimo= new BeanCorrispettivi();
        
        this.dataDa = new java.sql.Date( beanCorrispettivi.getDataDa().getTime());
        this.dataA = new java.sql.Date( beanCorrispettivi.getDataA().getTime());
        
        try{
            beanCorrispettivi.setDataDa(this.dataDa);
            beanCorrispettivi.setDataA(this.dataA);
            try{
                calcolaCorrispettivi();
                listaCorrispettivi.add(corrispettivoUltimo);
                beanCorrispettivi.setListaCorrispettivi(listaCorrispettivi);
                Utilita.getRequest().setAttribute("beanCorrispettivi",beanCorrispettivi);
            }catch(Exception e){
                e.printStackTrace();
                System.out.println("Errore"+e);
            }finally{
                DAOConnectionSingleton.closeSession();
            }
            
        }catch(Exception e){
            e.printStackTrace();
            System.out.println("Errore"+e);
        }finally{
            DAOConnectionSingleton.closeSession();
        }
        String url2 = "/dettaglioCorrispettivi.jsf";
        FacesContext ctx = FacesContext.getCurrentInstance();
        UIViewRoot view = ctx.getApplication().getViewHandler().createView(ctx,url2);
        view.setViewId(url2);
        ctx.setViewRoot(view);
        ctx.renderResponse();
    }
    
    
    public void stampaJasper() {
        FacesContext ctx = FacesContext.getCurrentInstance();
        beanCorrispettivi = (BeanCorrispettivi)ctx.getApplication().getVariableResolver().resolveVariable(ctx, "beanCorrispettivi");
        BeanStampa beanStampa = new BeanStampa(new Integer(0));
        if(beanCorrispettivi.getDataA() == null || beanCorrispettivi.getDataDa() == null){
            HtmlForm form = (HtmlForm)ctx.getViewRoot().findComponent("erroriDataBase");
            form.setRendered(true);
            ctx.addMessage("erroriDataBase", new FacesMessage("Inserire correttamente l'intervallo della data!"));
            Utilita.getRequest().setAttribute("beanStampaInventario", beanStampa);
            return;
        }
        
        try {
            HashMap parametri = new HashMap();
            parametri.put("dataDa", beanCorrispettivi.getDataDa());
            parametri.put("dataA", beanCorrispettivi.getDataA());
            beanStampa.setParametriStampa(parametri);
            beanStampa.setNomeStampa("Corrispettivi");
            super.setBeanStampa(beanStampa);
            super.stampaJasper();
        } catch(Exception ex) {
            Utilita.getRequest().setAttribute("beanStampaInventario", beanStampa);
        } finally {
            Utilita.getRequest().setAttribute("beanStampaInventario", beanStampa);
        }
        Utilita.getRequest().setAttribute("beanStampaInventario", beanStampa);
        return;
    }
    
}